/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ve.usb.cep.actions;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import ve.usb.cep.db.Session;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.HashMap;
import com.google.gson.Gson;
import java.util.ArrayList;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;

import ve.usb.cep.db.SelectObject;
import ve.usb.cep.db.domainObjects.Usuario;
import ve.usb.cep.db.models.UsuarioModel;
import ve.usb.cep.db.modelExceptions.UsuarioException;
import ve.usb.cep.util.sqlWhere;
/**
 *
 * @author Andras
 */
public class NoticiaA extends ActionSupport{

    //Salida por texto
    protected String output;
    protected String error;
    protected HashMap err = new HashMap();


    @Override
    public String execute(){

        if (!"Administrador".equals(user().getRol())){
            error = "Sólo administradores pueden gestionar noticias";
            return ERROR;
        }

        return SUCCESS;
    }
    
    public String ver_noticias(){
        return SUCCESS;
    }
    
    public String crear(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para crear noticias");
            return _finish();
        }
        
        String titulo, descripcion, fechahora;
        HttpServletRequest r = ServletActionContext.getRequest();
        
        titulo = r.getParameter("titulo");
        descripcion = r.getParameter("descripcion");
        
        if (titulo.equals("")) {
            err.put("ERROR", "Toda noticia debe tener un titulo");
            return _finish();
        }
        if (descripcion.equals("")) {
            err.put("ERROR", "Toda noticia debe tener una descripción");
            return _finish();
        }

        try{
            Connection conn = Session.connection();
            PreparedStatement pstmt;
            ResultSet rs;
            
            pstmt = conn.prepareStatement("select localtimestamp");
            rs = pstmt.executeQuery();
            rs.next();
            fechahora = rs.getString(1);
            
            pstmt = conn.prepareStatement("INSERT INTO noticia " +
                "(titulo, descripcion, fechahora)" +
                " VALUES (?, ?, CAST(? AS timestamp without time zone))");

            pstmt.setString(1, titulo);
            pstmt.setString(2, descripcion);
            pstmt.setString(3, fechahora);
            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
            return _finishWithExceptions(e);
        }
        return _finish();
    }

    public String editar(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para crear noticias");
            return _finish();
        }
        
        String titulo, descripcion, fechahora;
        HttpServletRequest r = ServletActionContext.getRequest();

        titulo = r.getParameter("titulo");
        descripcion = r.getParameter("descripcion");
        
        if (titulo.equals("")) {
            err.put("ERROR", "Toda noticia debe tener un titulo");
            return _finish();
        }
        if (descripcion.equals("")) {
            err.put("ERROR", "Toda noticia debe tener una descripción");
            return _finish();
        }
        
        try{
            Connection conn = Session.connection();
            PreparedStatement pstmt;
            ResultSet rs;
            
            pstmt = conn.prepareStatement("select localtimestamp");
            rs = pstmt.executeQuery();
            rs.next();
            fechahora = rs.getString(1);
            
            pstmt = conn.prepareStatement("UPDATE noticia " +
                "SET titulo=?, descripcion=?, fechahora=CAST(? AS timestamp without time zone)" +
                "WHERE codigo=?");

            pstmt.setString(1, titulo);
            pstmt.setString(2, descripcion);
            pstmt.setString(3, fechahora);
            pstmt.setInt(4, Integer.parseInt(r.getParameter("id")));
            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
            return _finishWithExceptions(e);
        }
        return _finish();
    }

    public String listar(){
        int rowCount = 0;
        HttpServletRequest sr = ServletActionContext.getRequest();
        HashMap[] m = null;
        int i = 0;
        try{
            Connection conn = Session.connection();
            ResultSet rs;
            PreparedStatement pstmt;
		
            pstmt = conn.prepareStatement("select count(*) from noticia");
            rs = pstmt.executeQuery();
            rs.next();
            rowCount = rs.getInt(1);
            
            pstmt = conn.prepareStatement("select * from noticia");
            rs = pstmt.executeQuery();
            
            m = new HashMap[rowCount];
            
            while (rs.next()){
                String[] c = new String[2];
                c[0] = rs.getString("titulo");
                c[1] = rs.getString("descripcion");
                HashMap e = new HashMap();
                e.put("id", rs.getInt("codigo"));
                e.put("cell", c);
                m[i] = e;

                ++ i;
            }
        } catch(java.sql.SQLException e){
            e.printStackTrace();
        }
        if (!err.isEmpty()){
            return _finish();
        }

        HashMap r = new HashMap();
        r.put("total", Math.ceil((double) rowCount / Integer.parseInt(sr.getParameter("rows"))));
        r.put("page", Integer.parseInt(sr.getParameter("page")));
        r.put("records", Integer.parseInt(sr.getParameter("rows")));
        r.put("rows", m);
 
        output = new Gson().toJson(r);

        return SUCCESS;
    }

    public String eliminar(){

        if (!"Administrador".equals(user().getRol())){
            err.put("error", "debe ser administrador para eliminar noticias");
            return _finish();
        }
        
        HttpServletRequest r = ServletActionContext.getRequest();

        try{
            Connection conn = Session.connection();
            PreparedStatement pstmt;
            
            pstmt = conn.prepareStatement("DELETE FROM noticia WHERE codigo=?");

            pstmt.setInt(1, Integer.parseInt(r.getParameter("id")));
            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
            return _finishWithExceptions(e);
        }
        return _finish();
    }

    protected String _finishWithExceptions(Exception e){
        ServletActionContext.getResponse()
                .setStatus(HttpServletResponse.SC_BAD_REQUEST);

        //Para los casos en los que el error sea interno, err estará vacío.
        if (null != e){
            e.printStackTrace();
            err.put("error interno", e.getMessage());
            output = new Gson().toJson(err);
        }
        return ERROR;
    }

    protected String _finish(){
        if (!err.isEmpty()){
            ServletActionContext.getResponse()
                .setStatus(HttpServletResponse.SC_BAD_REQUEST);
            output = new Gson().toJson(err);
            return ERROR;
        }

        return SUCCESS;
    }

    protected Usuario user(){

        Usuario u = (Usuario) ActionContext.getContext().getSession().get("user");
        if (null == u){
            u = new Usuario(0, "", "", "", 0, "Visitante", "", "", "", "");
        }
        return u;
    }

    //Output, salida estándar por texto
    public String getOutput() {
        return output;
    }

    public String getError(){
        return error;
    }
}